Software testing is often as expensive as software development. The goal of software testing is to provide assurance that the software behaves correctly. To this end, the tests should exercise as many parts of the developed software as possible, and they should indicate the intended behavior of the software. An implicit intended behavior is the absence of crashes. Thus, the software should respect the requirements of the execution environment.
Unit Tests are a common way to test programs, such as object-oriented programs. A unit test is a small program which provides input to a unit of the implementation-under-test (IUT), and asserts certain properties over the output of the IUT. Huge test suites of unit tests are commonly written by hand. Such unit tests are often written incrementally, as the code base increases. Determining which additional tests are needed is an expensive task. As the code base of the IUT changes, existing tests often become redundant, and new tests are written to achieve high coverage of the evolving program.